#pragma once

#include "QuakeTypes.h"
#include "QuakeBspModel.h"

namespace IdQuake
{
	typedef enum { ALIAS_SINGLE=0, ALIAS_GROUP } aliasframetype_t;
	typedef enum { ALIAS_SKIN_SINGLE=0, ALIAS_SKIN_GROUP } aliasskintype_t;

	//
	//Stuff from modelgen.h
	//

	#define IDPOLYHEADER	(('O'<<24)+('P'<<16)+('D'<<8)+'I')
															// little-endian "IDPO"
	#define ALIAS_VERSION	6
	#define MAX_LBM_HEIGHT	480
	#define	MAXALIASVERTS	1024
	#define	MAXALIASFRAMES	256
	#define	MAXALIASTRIS	2048
	#define ALIAS_BASE_SIZE_RATIO		(1.0 / 11.0)
						// normalizing factor so player model works out to about
						//  1 pixel per triangle

	typedef struct {
		int		onseam;
		int		s;
		int		t;
	} stvert_t;

	typedef struct dtriangle_s {
		int					facesfront;
		int					vertindex[3];
	} dtriangle_t;

	typedef struct {
		byte	v[3];
		byte	lightnormalindex;
	} trivertx_t;

	typedef struct {
		trivertx_t	bboxmin;	// lightnormal isn't used
		trivertx_t	bboxmax;	// lightnormal isn't used
		char		name[16];	// frame name from grabbing
	} daliasframe_t;

	typedef struct {
		int			numframes;
		trivertx_t	bboxmin;	// lightnormal isn't used
		trivertx_t	bboxmax;	// lightnormal isn't used
	} daliasgroup_t;

	typedef struct {
		int			numskins;
	} daliasskingroup_t;

	typedef struct {
		float	interval;
	} daliasinterval_t;

	typedef struct {
		float	interval;
	} daliasskininterval_t;

	typedef struct {
		aliasframetype_t	type;
	} daliasframetype_t;

	typedef struct {
		aliasskintype_t	type;
	} daliasskintype_t;

	typedef struct {
		int			ident;
		int			version;
		vec3_t		scale;
		vec3_t		scale_origin;
		float		boundingradius;
		vec3_t		eyeposition;
		int			numskins;
		int			skinwidth;
		int			skinheight;
		int			numverts;
		int			numtris;
		int			numframes;
		synctype_t	synctype;
		int			flags;
		float		size;
	} mdl_t;


	//
	//Stuff from model.h
	//
	/*
	==============================================================================

	ALIAS MODELS

	Alias models are position independent, so the cache manager can move them.
	==============================================================================
	*/

	typedef struct
	{
		aliasframetype_t	type;
		trivertx_t			bboxmin;
		trivertx_t			bboxmax;
		int					frame;
		char				name[16];
	} maliasframedesc_t;

	typedef struct
	{
		aliasskintype_t		type;
		void				*pcachespot;
		int					skin;
	} maliasskindesc_t;

	typedef struct
	{
		trivertx_t			bboxmin;
		trivertx_t			bboxmax;
		int					frame;
	} maliasgroupframedesc_t;

	typedef struct
	{
		int						numframes;
		int						intervals;
		maliasgroupframedesc_t	frames[1];
	} maliasgroup_t;

	typedef struct
	{
		int					numskins;
		int					intervals;
		maliasskindesc_t	skindescs[1];
	} maliasskingroup_t;

	// !!! if this is changed, it must be changed in asm_draw.h too !!!
	typedef struct mtriangle_s {
		int					facesfront;
		int					vertindex[3];
	} mtriangle_t;

	typedef struct {
		int					model;
		int					stverts;
		int					skindesc;
		int					triangles;
		maliasframedesc_t	frames[1];
	} aliashdr_t;

	void Mod_LoadAliasModel (model_t *mod, void *buffer);
	void Mod_FreeAliasModel (model_t *mod);
}